# 从Django导入mark_safe函数，用于标记字符串是安全的，可以被输出显示
from django.utils.safestring import mark_safe
# 导入下载安装的markdown模块
import markdown

from django.db.models import Count
# 从Django中导入template模块
from django import template
# 从当前应用的models文件中导入Post类
from ..models import Post
# 使用template中的Library()创建一个自定义标签注册器
# 通过该注册器可以将我们定义的函数注册为一个自定义标签
register = template.Library()
# 将定义的函数total_posts注册为自定义标签
@register.simple_tag
def total_posts(): # 定义一个自定义标签total_posts
 # 返回当前发布文章的数量
 return Post.published.count()


# 将show_latest_posts函数和blog/postlatests_posts.html注册为标签
@register.inclusion_tag('blog/post/latest_posts.html')
def show_latest_posts(count=5): # 默认获取最近发布的5篇文章
 # 获取最近发布的文章
 latest_posts = Post.published.order_by('-publish')[:count]
 # 将最近发布的文章传递至模板
 return {'latest_posts': latest_posts}



# 使用simple_tag将get_most_commented_posts函数注册为自定义模版标签
@register.simple_tag
def get_most_commented_posts(count=5): # 默认显示5篇文章
 # 对已经发布的文章统计评论数量保存并按照评论数量分组后按评论数量从大大小排序取前count个，count是函数参数，可以修改
   return Post.published.annotate(total_comments=Count('comments')).order_by('-total_comments')[:count]



# 使用filter函数将markdown_format函数注册为自定义过滤器
# 并将名称修改为markdown
@register.filter(name='markdown')
def markdown_format(text): # 定义markdown_format函数，接收text作为参数
 # 使用markdown模块提供的markdown方法将markdown格式的文章
 # 转化为正常阅读形式的文章，再使用mark_safe函数将这个字符串
 # 标记为安全，可以输出显示
  return mark_safe(markdown.markdown(text))